숫자 문자열과 영단어

NOTE

프로그래머스 · 문자열 파싱 숫자와 영어 숫자 단어가 섞인 문자열을 숫자로 변환하는 문제(예: one4seveneight → 1478). 실전에선 영단어 → 숫자 치환(replace) 이 가장 깔끔하다.

📝 문제

  • 문자열에 포함된 숫자와 영어 숫자 단어(zero~nine)를 모두 숫자로 바꿔 정수로 반환한다.
  • 예: one4seveneight → 1478, 23four5six7 → 234567.

💡 접근

세 가지 풀이 패턴이 있다.

패턴난이도코테 추천
replace 치환⭐⭐⭐⭐⭐
StringBuilder 파싱⭐⭐⭐⭐⭐
Trie / Dictionary parsing⭐⭐⭐⭐

문자열 길이 제한이 최대 50이라 성능 걱정이 없으므로 replace 치환이 베스트다.

⌨️ 풀이

패턴 1 — Replace (Best Practice) 영단어를 인덱스 숫자로 치환한 뒤 Integer.parseInt.

class Solution {
 
    public int solution(String s) {
        String[] words = {
            "zero", "one", "two", "three", "four",
            "five", "six", "seven", "eight", "nine"
        };
 
        for (int i = 0; i < words.length; i++) {
            s = s.replace(words[i], String.valueOf(i));
        }
 
        return Integer.parseInt(s);
    }
}

패턴 2 — Map + 직접 파싱 (원본 작성 방식) 문자를 하나씩 읽어 숫자는 바로 누적, 문자는 StringBuilder에 모으다가 Map에 존재하는 단어가 완성되면 숫자로 변환. 일반적인 파서 로직 학습에 좋으나 코드가 길고 가독성은 replace보다 떨어진다.

Map<String, Integer> numberMap = Map.ofEntries(
    Map.entry("zero", 0), Map.entry("one", 1), Map.entry("two", 2),
    Map.entry("three", 3), Map.entry("four", 4), Map.entry("five", 5),
    Map.entry("six", 6), Map.entry("seven", 7), Map.entry("eight", 8),
    Map.entry("nine", 9)
);
 
StringBuilder result = new StringBuilder();
StringBuilder sb = new StringBuilder();
 
for (char ch : s.toCharArray()) {
 
    if (Character.isDigit(ch)) {
        result.append(ch);
        continue;
    }
 
    sb.append(ch);
 
    if (numberMap.containsKey(sb.toString())) {
        result.append(numberMap.get(sb.toString()));
        sb.setLength(0);
    }
}
 
return Integer.parseInt(result.toString());

⏱️ 복잡도

  • 시간: O(N) — 문자열 길이에 비례(정규식/replace 내부도 문자열 길이 기준).
  • 공간: O(N).

📎 문자열 파싱 패턴

문제 유형패턴
문자 + 숫자 섞임StringBuilder
단어 → 숫자 변환replace
문자열 계산기 / 괄호 파싱Stack
토큰 분석Tokenizer

🔗 관련